﻿using System;
using System.Text.RegularExpressions;
using System.Web;
using Helper.FileUpload;

namespace Helper
{
    /// <summary>
    /// 권한 종류
    /// </summary>
    public enum AuthorizationType
    {
        Admins = 32,
        Operaters = 16,
        Intranet = 8,
        PowerUsers = 4,
        Users = 2,
        Guests = 1
    }

    /// <summary>
    /// 인증 종류
    /// </summary>
    public enum AuthenticationType
    {
        Admins = 32,
        Operaters = 48,
        PowerUsers = 52,
        Intranet = 56,
        IntranetPowerUsers = 60,
        Users = 62,
        Guests = 63
    }

    /// <summary>
    /// 기본 설정용 전역 클래스
    /// </summary>
    public static class Init
    {
        #region /// 지역 변수
        private static HttpRequest _Request;
        private static string _HostName;
        private static string _SiteDomain;
        private static int _Port;
        private static DateTime _CookieExpires;
        private static string _RemoteAddr;

        private static FileUploadInfo _FileServer;
        #endregion

        /// <summary>
        /// 기본 설정 정보 생성자
        /// </summary>
        static Init()
        {
            _Request = HttpContext.Current.Request;
            _HostName = _Request.Url.DnsSafeHost;
            _FileServer = new FileUploadInfo();

            _Port = _Request.Url.Port;

            Regex rx = new Regex(PATTERNS.Domain, RegexOptions.IgnoreCase);
            Match m = rx.Match(_HostName);
            _SiteDomain = m.Success ? m.Value : _HostName;

            if (_Port != 80)
                _HostName += ":" + _Port.ToString();

            _CookieExpires = DateTime.Now.AddDays(1.0);		// 기본 1일

            _RemoteAddr = _Request.UserHostAddress;

            // 기본 파일 서버 정보
            _FileServer.VirtualPath = "/file";
            _FileServer.Url = "http://file." + _SiteDomain;
        }

        #region /// 속성
        /// <summary>
        /// 사용자 IP를 가져옵니다.
        /// </summary>
        public static string RemoteAddr
        {
            get { return _RemoteAddr; }
        }
        /// <summary>
        /// 서버의 이름을 가져옵니다.
        /// </summary>
        public static string HostName
        {
            get { return _HostName; }
        }

        /// <summary>
        /// 포트 번호를 가져옵니다.
        /// </summary>
        public static int Port
        {
            get { return _Port; }
        }

        /// <summary>
        /// 쿠키 만료일을 가져오거나 설정합니다.
        /// </summary>
        public static DateTime CookieExpires
        {
            get { return _CookieExpires; }
            set { _CookieExpires = value; }
        }

        /// <summary>
        /// 사이트 도메인을 가져오거나 설정합니다.
        /// </summary>
        public static string SiteDomain
        {
            get { return _SiteDomain; }
            set { _SiteDomain = value; }
        }

        /// <summary>
        /// 파일 서버 정보를 가져옵니다.
        /// </summary>
        public static FileUploadInfo FileServer
        {
            get { return _FileServer; }
            set { _FileServer = value; }
        }
        #endregion

        /// <summary>
        /// 서버 정보
        /// </summary>
        public struct SERVER_INFO
        {
            public string Domain;
            public string IPAddress;
        }

        /// <summary>
        /// 패턴
        /// </summary>
        public struct PATTERNS
        {
            private static string _Domain;

            #region /// 생성자
            /// <summary>
            /// 생성자
            /// </summary>
            static PATTERNS()
            {
                _Domain = @"(\w+(?:(?:\.(?:co|pe|ne|go))?\.(?:kr|jp|cn))|net|com)$";
            }
            #endregion

            /// <summary>
            /// 모든 태그 패턴을 가져옵니다.
            /// </summary>
            public static string AllTag
            {
                get { return @"</?\w+[\d\w]*\s*[^>]*>"; }
            }

            /// <summary>
            /// 숫자 패턴을 가져옵니다.
            /// </summary>
            public static string Number
            {
                get { return @"\d+"; }
            }

            /// <summary>
            /// XSS 패턴을 가져옵니다.
            /// </summary>
            public static string XSS
            {
                get { return @"</?(?:script|iframe)\s*[^>]*>"; }
            }

            /// <summary>
            /// SQLInjection 패턴을 가져옵니다.
            /// </summary>
            public static string SQLInjection
            {
                get
                {
                    string b = @"(?:\+|%20|\s)";
                    string rst = "'?" + b + "+and" + b + @"+[\d']+" + b + "*=" + b + @"*[\d']+" +
                        "|'?" + b + "+and" + b + "*(?:char|cast)?" + b + @"*\(" +
                        "|delete" + b + "+from" +
                        "|drop" + b + "+(?:database|table|column|proc(?:edure)?)" +
                        "|create" + b + "+table" +
                        "|update" + b + "+.*" + b + "+set" +
                        "|insert" + b + "+into.*" + b + "+values" +
                        "|select" + b + "+.*" + b + "+from" +
                        "|exec" + b + "+.+" +
                        "|bulk" + b + "+insert" +
                        "|union" + b + "+select" +
                        "|alter" + b + "+table" +
                        "|into" + b + "+outfile" +
                        "|load" + b + "+data" +
                        "|declare.+varchar.+set" +
                        @"|/\*.*\*/" +
                        @"|\.{1,2}/";
                    return rst;
                }
            }

            /// <summary>
            /// 도메인 패턴을 가져오거나 설정합니다.
            /// </summary>
            public static string Domain
            {
                get { return _Domain; }
                set { _Domain = value; }
            }
        }


    }

}
